Maximum performance of a team [Min Cost to Hire K Workers]

Time: O(NLogN); Space: O(N); hard

There are n engineers numbered from 1 to n and two arrays:

speed and efficiency, where speed[i] and efficiency[i] represent the speed and efficiency for the i-th engineer respectively.

Return the maximum performance of a team composed of at most k engineers, since the answer can be a huge number, return this modulo 10^9 + 7.

The performance of a team is the sum of their engineers’ speeds multiplied by the minimum efficiency among their engineers.

Example 1:

Input: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2

Output: 60

Explanation:

We have the maximum performance of the team by selecting engineer 2 (with speed=10 and efficiency=4) and engineer 5 (with speed=5 and efficiency=7). That is, performance = (10 + 5) * min(4, 7) = 60.

Example 2:

Input: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3

Output: 68

Explanation:

This is the same example as the first but k = 3. We can select engineer 1, engineer 2 and engineer 5 to get the maximum performance of the team. That is, performance = (2 + 10 + 5) * min(5, 4, 7) = 68.

Example 3:

Input: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4

Output: 72

Constraints:

  • 1 <= n <= 10^5

  • len(speed) == n

  • len(efficiency) == n

  • 1 <= speed[i] <= 10^5

  • 1 <= efficiency[i] <= 10^8

  • 1 <= k <= n

Hints:

  1. Keep track of the engineers by their efficiency in decreasing order.

  2. For each engineer’s efficiency take the K highest speeds among the engineers previously tracked.

[1]:
import heapq

class Solution1(object):
    """
    Time: O(NLogN)
    Space: O(N)
    """
    def maxPerformance(self, n, speed, efficiency, k):
        """
        :type n: int
        :type speed: List[int]
        :type efficiency: List[int]
        :type k: int
        :rtype: int
        """
        MOD = 10**9 + 7
        result, s_sum = 0, 0
        min_heap = []

        for e, s in sorted(zip(efficiency, speed), reverse=True):
            s_sum += s
            heapq.heappush(min_heap, s)
            if len(min_heap) > k:
                s_sum -= heapq.heappop(min_heap)
            result = max(result,s_sum*e)

        return result % MOD
[2]:
s = Solution1()

n = 6
speed = [2,10,3,1,5,8]
efficiency = [5,4,3,9,7,2]
k = 2
assert s.maxPerformance(n, speed, efficiency, k) == 60

n = 6
speed = [2,10,3,1,5,8]
efficiency = [5,4,3,9,7,2]
k = 3
assert s.maxPerformance(n, speed, efficiency, k) == 68

n = 6
speed = [2,10,3,1,5,8]
efficiency = [5,4,3,9,7,2]
k = 4
assert s.maxPerformance(n, speed, efficiency, k) == 72